package com.mh.springboot;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

import java.util.Map;

/**
 * springboot 核心类
 */

public class MhSpringApplication {

    /**
     *
     * 1.创建一个Spring容器
     * 2.创建Tomcat对象
     * 3.生成DispatcherServlet对象，并且和前面创建出来的Spring容器进行绑定
     * 4.将DispatcherServlet添加到Tomcat中
     * 5.启动Tomcat
     */
    public static void run(Class clazz) {
        // 1、创建一个spring容器
        // 2、这个是spring的功能，根据传入clazz类路径来扫描包
        // 3、能够自动扫描并创建bean，且存到AutoConfiguration容器里
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.register(clazz);
        applicationContext.refresh();

        // 这样，我们就只需要在getWebServer方法中去判断到底该返回TomcatWebServer还是JettyWebServer。
        WebServer webServer = getWebServer(applicationContext);
        webServer.start();
    }

    // 获取web服务, 根据添加的tomcat或者jetty依赖，自动选择对应的web服务来启动
    public static WebServer getWebServer(WebApplicationContext applicationContext){
        // 从spring容器中获取tomcat或者jetty的bean对象
        // key为beanName, value为Bean对象， 通过接口去获取，拿到的可能是多个实现类对象
        Map<String, WebServer> webServers = applicationContext.getBeansOfType(WebServer.class);

        if (webServers.isEmpty()) {
            throw new NullPointerException();
        }
        if (webServers.size() > 1) {
            throw new IllegalStateException();
        }

        // 返回唯一的一个
        return webServers.values().stream().findFirst().get();
    }

}
